import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 实际数据测试
 * 使用您提供的真实数据进行验证
 */
public class ActualDataTest {
    
    public static void main(String[] args) {
        System.out.println("=== 实际数据转换测试 ===");
        
        // 根据您之前提供的数据进行测试
        testActualData();
        
        // 测试可能的问题场景
        testProblemScenarios();
    }
    
    /**
     * 测试实际数据
     */
    private static void testActualData() {
        System.out.println("\n--- 您提供的实际数据测试 ---");
        
        // 原始数据：672669.0000 + 686.0000 + 37.0000 + 119.0000 = 673511
        // 转换后应该是：672.669 + 0.686 + 0.037 + 0.000119 ≈ 673.392119 吨
        
        System.out.println("原始数据转换：");
        testConversion("672669", "kg", "672.67吨");  // 纸品类 kg转吨
        testConversion("686", "kg", "0.69吨");       // 旧衣类 kg转吨  
        testConversion("37", "kg", "0.04吨");        // 塑料类 kg转吨
        testConversion("119", "g", "0.00吨");        // 贵重金属 g转吨
        
        // 计算总和
        BigDecimal total = convertKgToTon(new BigDecimal("672669"))
                .add(convertKgToTon(new BigDecimal("686")))
                .add(convertKgToTon(new BigDecimal("37")))
                .add(convertGToTon(new BigDecimal("119")));
        
        System.out.println("\n总计算：");
        System.out.println("672.67 + 0.69 + 0.04 + 0.00 = " + total.setScale(2, RoundingMode.HALF_UP) + "吨");
        System.out.println("格式化后：" + formatWeightValue(total));
        
        // 测试如果总量达到千吨级别
        System.out.println("\n假设更大的数据：");
        testConversion("1200669", "kg", "1200.67吨 -> 1.20千吨");
        BigDecimal largeTotal = convertKgToTon(new BigDecimal("1200669"));
        System.out.println("大数值格式化：" + formatWeightValue(largeTotal));
    }
    
    /**
     * 测试可能的问题场景
     */
    private static void testProblemScenarios() {
        System.out.println("\n--- 可能的问题场景测试 ---");
        
        // 测试接近1000的值
        System.out.println("接近1000吨的测试：");
        testDirectConversion("999.99", "999.99吨");
        testDirectConversion("999.994", "999.99吨");
        testDirectConversion("999.995", "1000.00吨");
        testDirectConversion("999.996", "1000.00吨");
        testDirectConversion("1000.00", "1.00千吨");
        testDirectConversion("1000.004", "1.00千吨");
        
        // 测试kg转换后接近1000的情况
        System.out.println("\nkg转换接近1000吨的测试：");
        testConversion("999990", "kg", "999.99吨");      // 999.99吨
        testConversion("999994", "kg", "999.99吨");      // 999.994吨 -> 999.99吨
        testConversion("999995", "kg", "1000.00吨");     // 999.995吨 -> 1000.00吨
        testConversion("1000000", "kg", "1.00千吨");     // 1000吨 -> 1.00千吨
        testConversion("1000004", "kg", "1.00千吨");     // 1000.004吨 -> 1.00千吨
    }
    
    /**
     * 测试单位转换
     */
    private static void testConversion(String valueStr, String fromUnit, String expected) {
        BigDecimal value = new BigDecimal(valueStr);
        BigDecimal converted;
        
        switch (fromUnit.toLowerCase()) {
            case "kg":
                converted = convertKgToTon(value);
                break;
            case "g":
                converted = convertGToTon(value);
                break;
            default:
                converted = value;
                break;
        }
        
        String result = formatWeightValue(converted);
        String status = result.equals(expected.split(" -> ")[0]) ? "✓" : "✗";
        System.out.println(status + " " + valueStr + fromUnit + " -> " + converted.setScale(6, RoundingMode.HALF_UP) + "吨 -> \"" + result + "\"");
        
        if (expected.contains(" -> ")) {
            System.out.println("    期望: " + expected);
        }
    }
    
    /**
     * 测试直接转换
     */
    private static void testDirectConversion(String valueStr, String expected) {
        BigDecimal value = new BigDecimal(valueStr);
        String result = formatWeightValue(value);
        String status = result.equals(expected) ? "✓" : "✗";
        System.out.println(status + " " + valueStr + "吨 -> \"" + result + "\" (期望: \"" + expected + "\")");
    }
    
    /**
     * kg转吨
     */
    private static BigDecimal convertKgToTon(BigDecimal kg) {
        return kg.divide(new BigDecimal("1000"), 6, RoundingMode.HALF_UP);
    }
    
    /**
     * g转吨
     */
    private static BigDecimal convertGToTon(BigDecimal g) {
        return g.divide(new BigDecimal("1000000"), 6, RoundingMode.HALF_UP);
    }
    
    /**
     * 格式化重量值
     */
    private static String formatWeightValue(BigDecimal value) {
        if (value == null) {
            value = BigDecimal.ZERO;
        }
        
        // 保留2位小数
        BigDecimal formattedWeight = value.setScale(2, RoundingMode.HALF_UP);
        
        // 如果大于等于1000吨，转换为千吨
        if (formattedWeight.compareTo(new BigDecimal("1000")) >= 0) {
            BigDecimal weightInKiloTons = formattedWeight.divide(new BigDecimal("1000"), 2, RoundingMode.HALF_UP);
            return weightInKiloTons.toString() + "千吨";
        } else {
            return formattedWeight.toString() + "吨";
        }
    }
}
